
#ifndef EDGEVALIDATOR_HPP_
#define EDGEVALIDATOR_HPP_

#include "../logger/logger.hpp"
#include "parser.hpp"
#include "controlEdge.hpp"
#include "../main/graph.hpp"

/**
 * Class EdgeValidator: encargada de la validacion de las
 * aristas.
 * Validaciones:
 *  - cantidad de campos
 *  - formato de los campos (campos obligatoriamente positivos)
 *  - insercion en el grafo (verifica exitencia de aristas
 *  con mismo id en un mismo nodo)
 *
 */
class EdgeValidator {
private:
	Parser		parser;
	Logger		*logger;
	Graph		*graph;
	int			numberOfFieldsExpected;
	ControlEdge	edge;

public:

	/**
	 * Constructor por defecto de la clase EdgeValidator.
	 */
	EdgeValidator(){}

	/**
	 * Destructor de la clase EdgeValidator.
	 */
	virtual ~EdgeValidator();

	/**
	 * Generador del contenido de la clase EdgeValidator.
	 */
	void create(std::string &fileToParse, std::string &fileConf, Logger *log, int numberOfFields, Graph *graph);

	/**
	 * Metodo que inicia la validacion las aristas ingresantes.
	 */
	void validate();

	/**
	 * Metodo que valida la cantidad de campos de la arista ingresante.
	 * @param lineCount de tipo int.
	 * @param fieldAmount de tipo int.
	 */
	void validateNumberOfFields(int lineCount, int fieldAmount);

	/**
	 * Metodo que valida el tipo del campo de la arista ingresante.
	 * @param lineCount de tipo int.
	 * @param fieldNumber de tipo int.
	 * @param field de clase std::string.
	 */
	void validateField(int lineCount, int fieldNumber, std::string field);

	/**
	 * Metodo que valida la insercion de la arista al grafo.
	 * @param lineCount de tipo int.
	 */
	void validateGraphElementAdding(int lineCount);
};

#endif /* EDGEVALIDATOR_HPP_ */
